#!/usr/bin/env python
# -*- coding:utf-8 -*-
import base64
import pickle
from django_redis import get_redis_connection
def merge_cart_cookie_to_redis(request,user,response):

    """
    把cookie数据合并到redis中
    先获取cookie数据
    再获取redis数据
    合并成和redis一样的数据
    合并的原则：
        １．合并的时候全部以cookie为准，redis数据全部删除
        ２．合并的时候，以redis为准，cookie数据就存在两个情况
            ①如果redis中没有商品id，则cookie中商品id添加到redis中
            ②如果redis中有商品id，商品的个数，要么以cookie为准，要么以redis为准，或这以它们累加为准

    """
    # 1.获取cookie数据，需要对cookie数据进行判断
    #     如果有cookie数据，需要对cookie数据进行解码
    #     如果没有cookie数据，则直接进行返回
    cookie_str = request.COOKIES.get('cart')
    if cookie_str is not None:
        cookie_cart = pickle.loads(base64.b64decode(cookie_str))
        # {1: {count: 10, selected: True}, 3: {count: 10, selected: True}, }
        # 2.获取redis数据
        #     链接redis
        redis_conn = get_redis_connection('cart')
        #     获取hash数据
        redis_cart = redis_conn.hgetall('cart_%s'%user.id)
        #     获取set数据
        redis_selected_ids = redis_conn.smembers('cart_selected_%s'%user.id)
        #     需要对数据进行处理,转化成普通字典格式
        cart = {}
        for sku_id,count in redis_cart.items():
            cart[sku_id.decode()] = int(count)

        cart_list_ids = []
        for sku_id in redis_selected_ids:
            cart_list_ids.append(int(sku_id))
        # 3.对cookie数据进行遍历，进行合并
        # {1: {count: 10, selected: True}, 3: {count: 10, selected: True}, }
        for sku_id,count_selected_dict in cookie_cart.items():
            #     判断商品id是否存在redis中(如果在redis中则直接进行替换更新，如果不在则直接添加)
            #     进行数据的更新
            cart[sku_id] = count_selected_dict['count']

            if count_selected_dict['selected']:
                cart_list_ids.append(sku_id)
        # 将数据保存到redis中
        redis_conn.hmset('cart_%s'%user.id,cart)

        redis_conn.sadd('cart_selected_%s'%user.id,*cart_list_ids)

        response.delete_cookie('cart')

        return response

    else:

        return response